/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.talentos.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.seguranca.facade.LoginFacade;
import br.uniceub.fsw.talentos.dao.TipoHabilidadeDAO;
import br.uniceub.fsw.talentos.dao.HabilidadeDAO;
import br.uniceub.fsw.talentos.vo.HabilidadeVO;
import br.uniceub.fsw.talentos.vo.TipoHabilidadeVO;
import br.uniceub.fsw.talentos.vo.CapacitacaoVO;
import br.uniceub.fsw.talentos.bo.HabilidadeBO;
import br.uniceub.fsw.talentos.dao.CapacitacaoDAO;
import br.uniceub.fsw.util.TabelaHtml;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Facade da entidade Habilidade.
 * 
 * @author Bruno Henrique Sousa do Val
 */
public class HabilidadeFacade {
    /**
     * Mensagem de retorno do sistema.
     */
    private String message;

    /**
     * Value object do habilidade.
     */
    private HabilidadeVO habilidade;
    
    /**
     * Value object da capacitacao.
     */
    private CapacitacaoVO capacitacao;    
    
    /**
     * Value object do tipo de habilidade.
     */
    private TipoHabilidadeVO tipoHabilidade;

    /**
     * Objeto de acesso aos dados de habilidade.
     */
    private HabilidadeDAO habilidadeDao;

    /**
     * Objeto de acesso aos dados de capacitacao.
     */
    private CapacitacaoDAO capacitacaoDao;    
    
    /**
     * Objeto da camada de negócio de habilidade.
     */
    private HabilidadeBO habilidadeBo;
    
    /**
     * Construtor da classe.
     */
    public HabilidadeFacade() {
        this.habilidadeDao = new HabilidadeDAO();
        this.habilidadeBo = new HabilidadeBO();
    }
    
    /**
     * Getter da mensagem de retorno.
     * 
     * @return Mensagem de retorno.
     */
    public String getMessage() {
        String retorno = null;
        if(this.message == null || this.message.equals("")) {
            retorno = "&nbsp";
        } else {
            retorno = this.message;
        }
        return retorno;
    }

    /**
     * Setter da mensagem de retorno.
     * 
     * @param message Mensagem de retorno.
     */
    public void setMessage(String message) {
        this.message = message;
    }
    
    /**
     * Responsável por executar a operação selecionada pelo usuário.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void operacao(HttpServletRequest req, HttpServletResponse resp) {
        String oper = req.getParameter("operacao");

        if(oper != null)
        {
            if (oper.equals("consultar")) {
                this.consultar(req, resp);
            }
            if (oper.equals("incluir")) {
                this.incluir(req, resp);
            }
            if (oper.equals("alterar")) {
                this.alterar(req, resp);
            }
            if (oper.equals("excluir")) {
                this.excluir(req, resp);
            }
            if (oper.equals("confirmar")) {
                this.confirmar(req, resp);
            }
            if (oper.equals("recarregar")) {
                this.recarregar(req, resp);
            }            
            if (oper.equals("definirHabilidade")) {
                this.definirHabilidade(req, resp);
            }            
            if (oper.equals("excluirCapacitacao")) {
//                this.excluirCapacitacao(req, resp);
            }            
        }
    }

    /**
     * Retorna o habilidade.
     * 
     * @return Objeto habilidade.
     */
    public HabilidadeVO getHabilidade() {
        return this.habilidade;
    }
    
    /**
     * Seta o habilidade.
     * 
     * @param habilidade Objeto habilidade.
     */
    public void setHabilidade(HabilidadeVO habilidade) {
        this.habilidade = habilidade;
    }
    
    public TipoHabilidadeVO getTipoHabilidade() {
        return tipoHabilidade;
    }

    public void setTipoHabilidade(TipoHabilidadeVO tipoHabilidade) {
        this.tipoHabilidade = tipoHabilidade;
    }

    
    /**
     * Consultar um habilidade.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void consultar(HttpServletRequest req, HttpServletResponse resp) {
        String idHabilidadeTmp = req.getParameter("idHabilidade");
        
        Integer idHabilidade = null;
        
        if(idHabilidadeTmp == null || idHabilidadeTmp.equals("")) {
            return;
        } else {
            idHabilidade = Integer.parseInt(idHabilidadeTmp);
        }
        
        this.habilidade = habilidadeDao.consultarPorId(idHabilidade);
    }

    /**
     * Incluir uma habilidade.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void incluir(HttpServletRequest req, HttpServletResponse resp) {
        String noHabilidade = req.getParameter("noHabilidade");
        String cdTipoHabilidade = req.getParameter("cdTipoHabilidade");

        habilidade = new HabilidadeVO();
        habilidade.setNoHabilidade(noHabilidade);
        habilidade.setCdTipoHabilidade(cdTipoHabilidade==null?null:cdTipoHabilidade==""?null:Integer.parseInt(cdTipoHabilidade));
        
        String mensagem = null;
        
        // Validações da BO
        try {
            habilidadeBo.validarVOUnico(habilidade);
        } catch(NegocioException ex) {
            mensagem = ex.getMessage();
        }
        
        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                habilidadeDao.inserir(habilidade);

                Transacao.efetivar();

                mensagem = "Habilidade incluída com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na inclusão da habilidade: " + ex.getMessage();
                
                habilidade = null;
            }
        } else {
            habilidade = null;
        }
        
        this.message = mensagem;
    }

    /**
     * Alterar uma habilidade.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void alterar(HttpServletRequest req, HttpServletResponse resp) {
        String idHabilidade = req.getParameter("idHabilidade");
        String noHabilidade = req.getParameter("noHabilidade");
        String cdTipoHabilidade = req.getParameter("cdTipoHabilidade");

        habilidade = new HabilidadeVO();
        habilidade.setIdHabilidade(idHabilidade==null?null:Integer.parseInt(idHabilidade));
        habilidade.setNoHabilidade(noHabilidade);
        habilidade.setCdTipoHabilidade(cdTipoHabilidade==null?null:cdTipoHabilidade==""?null:Integer.parseInt(cdTipoHabilidade));
        
        String mensagem = null;
        
        // Validações da BO
        try {
            habilidadeBo.validarVOUnico(habilidade);
        } catch(NegocioException ex) {
            mensagem = ex.getMessage();
        }
        
        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                habilidadeDao.alterar(habilidade);

                Transacao.efetivar();

                mensagem = "habilidade alterada com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na alteração da habilidade: " + ex.getMessage();
            }
        } else {
            habilidade = null;
        }
        
        this.message = mensagem;
    }

    /**
     * Excluir uma habilidade.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void excluir(HttpServletRequest req, HttpServletResponse resp) {
        String mensagem = null;
                
        habilidade = new HabilidadeVO();
        
        try {
            habilidade.setIdHabilidade(Integer.parseInt(req.getParameter("idHabilidade")));
        }
        catch (NumberFormatException e) {
            mensagem = "ID da habilidade inválido";
        }
        
        if(mensagem == null) {
            try {
                new HabilidadeBO().validarExclusao(habilidade);
                Transacao.iniciar();
                new HabilidadeDAO().excluir(habilidade);
                Transacao.efetivar();
                mensagem = "Habilidade excluída com sucesso.";
            }            
            catch (NegocioException ex) {
                mensagem = "Problema na exclusão da habilidade: " + ex.getMessage();
            }
            catch (Exception ex) {
                mensagem = "Problema na exclusão da habilidade: " + ex.getMessage();
            }
        }
        
        this.habilidade = null;
        
        this.message = mensagem;
    }
    
    /**
     * Definir uma habilidade.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void definirHabilidade(HttpServletRequest req, HttpServletResponse resp) {
        String idHabilidade_temp = req.getParameter("idHabilidade");
        String dtCapacitacao = req.getParameter("dtCapacitacao");
        String stCertificado = req.getParameter("stCertificado");
        String cdTalento_temp = req.getParameter("cdTalento");
        
        Integer idHabilidade = (idHabilidade_temp == null || idHabilidade_temp.isEmpty())?null:Integer.parseInt(idHabilidade_temp);
        Integer cdTalento = (cdTalento_temp == null || cdTalento_temp.isEmpty())?null:Integer.parseInt(cdTalento_temp);

        capacitacao = new CapacitacaoVO();
        capacitacao.setCdHabilidade(idHabilidade);
        capacitacao.setCdTalento(cdTalento);
        
        String mensagem = null;
        
        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                capacitacaoDao.inserir(capacitacao);

                Transacao.efetivar();

                mensagem = "Habilidade definida com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na definição da habilidade: " + ex.getMessage();
                
                capacitacao = null;
            }
        } else {
            capacitacao = null;
        }
        
        this.message = mensagem;
    }

    /**
     * Recarregar a página após alguma ação de seleção de combo.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void recarregar(HttpServletRequest req, HttpServletResponse resp) {
        String idTipoHabilidade = req.getParameter("idTipoHabilidade");
        String idHabilidade = req.getParameter("idHabilidade");
        
        TipoHabilidadeDAO tipoHabilidadeDao = new TipoHabilidadeDAO();

        if (idTipoHabilidade != null && !idTipoHabilidade.isEmpty()) {
            tipoHabilidade = tipoHabilidadeDao.consultarPorId(idTipoHabilidade);
        }
        
        if (idHabilidade != null && !idHabilidade.isEmpty()) {
            habilidade = habilidadeDao.consultarPorId(idHabilidade);
        }
    }
    
    /**
     * Confirmar a exclusão de habilidade.
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void confirmar(HttpServletRequest req, HttpServletResponse resp) {
        String idHabilidade = req.getParameter("idHabilidade");
        String noHabilidade = req.getParameter("noHabilidade");

        habilidade = new HabilidadeVO();
        habilidade.setIdHabilidade(Integer.parseInt(idHabilidade));
        habilidade.setNoHabilidade(noHabilidade);
    }

    /**
     * Retorna uma lista de tipos de habilidade ordenada por nome
     * 
     * @return lista com as informações necessárias
     */
    public List<List> consultarTiposHabilidade() {
        List<List> lista = new ArrayList<List>();

        TipoHabilidadeDAO tipoHabilidadeDao = new TipoHabilidadeDAO();
        
        List<TipoHabilidadeVO> tipos = tipoHabilidadeDao.consultarTiposOrdenadoPorNome();
        
        for(int i = 0; i < tipos.size(); i++) {
            List<String> registro = new ArrayList<String>();
            registro.add(tipos.get(i).getIdTipoHabilidade().toString());
            registro.add(tipos.get(i).getNoTipoHabilidade());
            
            lista.add(registro);
        }
        
        return lista;
    }
    
    public List<List> consultarHabilidadesPorTipo(HttpServletRequest req, HttpServletResponse resp) {
        String idTipoHabilidade_tmp = req.getParameter("idTipoHabilidade");
        
        Integer idTipoHabilidade = (idTipoHabilidade_tmp == null || idTipoHabilidade_tmp.equals(""))?null:Integer.parseInt(idTipoHabilidade_tmp);
        
        List<List> lista = new ArrayList<List>();

        HabilidadeDAO habilidadeDao = new HabilidadeDAO();
        
        List<HabilidadeVO> habilidades = habilidadeDao.consultarHabilidadesPorTipoOrdenadoPorNome(idTipoHabilidade);
        
        for(int i = 0; i < habilidades.size(); i++) {
            List<String> registro = new ArrayList<String>();
            registro.add(habilidades.get(i).getIdHabilidade().toString());
            registro.add(habilidades.get(i).getNoHabilidade());
            
            lista.add(registro);
        }
        
        return lista;
    }

     /**
     * Retorna uma lista de habilidades a partir de parâmetros da tela
     * 
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return objeto tabela com as informações necessárias
     */
    public TabelaHtml consultarHabilidades(HttpServletRequest req, HttpServletResponse resp) {
        String nome = req.getParameter("noHabilidade");
        
        if(nome != null && !nome.equals("")) {
            TabelaHtml tabela = new TabelaHtml();
            
            tabela.setCampoRetorno("idHabilidade");
            
            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(80);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);
            
            tabela.gravarCampos();
            
            HabilidadeVO exemplo = new HabilidadeVO();
            
            exemplo.setNoHabilidade(nome);
            
            // Lista de habilidades
            List<HabilidadeVO> habilidades = habilidadeDao.consultarPorExemplo(exemplo);
            
            // Adiciona os valores de cada habilidade nas listas de ids e nomes
            for(int i = 0; i < habilidades.size(); i++) {
                tabela.adicionarRegistro(converterVoParaString(habilidades.get(i)));
            }

            return tabela;
        }
        
        return null;
    }
    
    public TabelaHtml consultarHabilidadesPorTalento(HttpServletRequest req, HttpServletResponse resp) {
        String cdTalento = req.getParameter("cdTalento");
        
        if(cdTalento == null || cdTalento.isEmpty()) {
            LoginFacade loginFacade = new LoginFacade();
            cdTalento = loginFacade.pegarCdTalento(req, resp).toString();
        }
        
        TabelaHtml tabela = new TabelaHtml();

        tabela.setCampoRetorno("idHabilidade");

        tabela.adicionarTitulo("Id");
        tabela.adicionarTamanho(0);
        tabela.adicionarTipo("Integer");
        tabela.adicionarStatus(false);

        tabela.adicionarTitulo("Nome");
        tabela.adicionarTamanho(80);
        tabela.adicionarTipo("String");
        tabela.adicionarStatus(true);

        tabela.gravarCampos();

        // Lista de habilidades
        Integer idTalento = Integer.parseInt(cdTalento);
        List<HabilidadeVO> habilidades = habilidadeDao.consultarHabilidadesPorTalento(idTalento);

        // Adiciona os valores de cada habilidade nas listas de ids e nomes
        for(int i = 0; i < habilidades.size(); i++) {
            tabela.adicionarRegistro(converterVoParaString(habilidades.get(i)));
        }

        return tabela;
    }    
    
    /**
     * Transforma os campos de um VO em uma lista de Strings
     * 
     * @return lista de strings com os valores em ordem
     */
    public List<String> converterVoParaString(HabilidadeVO habilidade) {
        List<String> valores = new ArrayList<String>();
        
        valores.add(habilidade.getIdHabilidade().toString());
        valores.add(habilidade.getNoHabilidade());
        
        return valores;
    }
}
